package middlewares

import (
	"bytes"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
)

/*
AdminMiddleWare 是一个自定义的中间件, 返回值也是一个函数 ,这涉及到Go语言的闭包功能:
闭包并不是一门编程语言不可缺少的功能，但闭包的表现形式一般是以匿名函数的方式出现，就象上面说到的，能够动态灵活的创建以
及传递，体现出函数式编程的特点。所以在一些场合，我们就多了一种编码方式的选择，适当的使用闭包可以使得我们的代码简洁高效。
由于闭包会使得函数中的变量都被保存在内存中，内存消耗很大，所以不能滥用闭包*/
func AdminMiddleWare() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		data, err := ctx.GetRawData()
		if err != nil {
			fmt.Println(err.Error())
		}
		fmt.Printf("data: %v\n", string(data))
		ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) // 将body的数据放入body中,以便后续的处理器继续使用
		ctx.Next()                                                 // 执行下一个处理器
	}
}
